import exceptions.NoJuegaException
import futbol5.Condicional
import futbol5.Estandar
import futbol5.Jugador
import futbol5.Partido
import futbol5.PorEdad
import futbol5.SiNoJuega
import futbol5.SonTantosOMenos
import org.junit.Before
import org.junit.Test

import static org.junit.Assert.*
import futbol5.Administrador
import futbol5.CompuestaAND
import futbol5.CompuestaOR



class TestCondiciones {
	
	Partido partido
	Jugador ale
	Jugador eric
	Jugador daiana
	SiNoJuega condicionAleJugador
	PorEdad condicionAleEdad
	SonTantosOMenos condicionAleEquipo
	Condicional tipoAle
	Administrador adminPartidos
	CompuestaAND compAnd
	CompuestaOR compOr

	
		
	@Before
	def void init(){
		partido = new Partido
		
		ale = new Jugador
		eric = new Jugador
		daiana = new Jugador
		
		adminPartidos = new Administrador
		
				
		
		tipoAle = new Condicional
		ale.categoria = tipoAle
		eric.categoria = new Estandar
		daiana.categoria = new Estandar
		
		compAnd = new CompuestaAND
		compOr = new CompuestaOR
		
		partido.agregarJugador(eric)
		
	}
	
	@Test
	def void TestJugadorNoQuerido(){
		condicionAleJugador = new SiNoJuega
		tipoAle.condicion = condicionAleJugador
		condicionAleJugador.jugadorNoQuerido = eric
		
		assertFalse(ale.juegoEn(partido))
	}
		
	@Test
	def void TestJugadorQuerido(){
		condicionAleJugador = new SiNoJuega
		tipoAle.condicion = condicionAleJugador
		condicionAleJugador.jugadorNoQuerido = daiana
		
		assertTrue(ale.juegoEn(partido))
	}
	
	@Test 
	def void TestEdadFalse(){
		eric.edad = 13
		condicionAleEdad = new PorEdad
		tipoAle.condicion = condicionAleEdad
		condicionAleEdad.edadMinima = 15
		
		assertFalse(ale.juegoEn(partido))
	}
	
	@Test 
	def void TestEdadTrue(){
		eric.edad = 18
		condicionAleEdad = new PorEdad
		tipoAle.condicion = condicionAleEdad
		condicionAleEdad.edadMinima = 15
		
		assertTrue(ale.juegoEn(partido))
	}
	
	@Test 
	def void TestEquipoChico(){
		condicionAleEquipo = new SonTantosOMenos
		tipoAle.condicion = condicionAleEquipo
		condicionAleEquipo.cantidadMaxima = 2
		
		assertTrue(ale.juegoEn(partido))
	}
	
	@Test
	def void TestEquipoGrande(){
		condicionAleEquipo = new SonTantosOMenos
		tipoAle.condicion = condicionAleEquipo
		condicionAleEquipo.cantidadMaxima = 2
		partido.agregarJugador(daiana)
		
		assertFalse(ale.juegoEn(partido))
	}
	
	
	@Test (expected=typeof(NoJuegaException))
	def void noJuega(){
		condicionAleJugador = new SiNoJuega
		tipoAle.condicion = condicionAleJugador
		condicionAleJugador.jugadorNoQuerido = daiana
		partido.agregarJugador(ale)
		partido.agregarJugador(daiana)
	}
 
	@Test
	def void TestCompuestasOR(){
		tipoAle.condicion= compOr
		var condicionUno = new SiNoJuega
		condicionUno.jugadorNoQuerido= daiana
		var condicionDos = new PorEdad
		condicionDos.edadMinima = 18
		daiana.edad = 20
		compOr.condiciones.add(condicionUno)
		compOr.condiciones.add(condicionDos)
		
		assertTrue(ale.juegoEn(partido))
	}
	
	@Test
	def void TestCompuestasAND(){
		tipoAle.condicion= compAnd
		var condicionUno = new SiNoJuega
		condicionUno.jugadorNoQuerido= daiana
		var condicionDos = new PorEdad
		condicionDos.edadMinima = 18
		daiana.edad = 20
		compAnd.condiciones.add(condicionUno)
		compAnd.condiciones.add(condicionDos)
		partido.agregarJugador(daiana)
		
		assertFalse(ale.juegoEn(partido))
	}
}